<?php
class CodigoDocumento extends AppModel {

    var $name = 'CodigoDocumento';	
   
    var $validate = array(
        'id'=>array(
            'rule'=>'numeric',
            'message'=>'Obligarorio y numerico',
            'required'=>true,
            'allowEmpty'=>false
        )
    );

    function getDocumentLastUse($codigo = null, $serie = null){
        $usuario = $_SESSION['Usuario'];
        $this->CodigoDocumentoDetalle->recursive = -1;
        $data = $this->CodigoDocumentoDetalle->find('first', array(
            'conditions'=>array(
                'CodigoDocumentoDetalle.codigo_documento_id'=>$codigo,
                'CodigoDocumentoDetalle.serie'=>$serie,
                'CodigoDocumentoDetalle.empresa_id'=>$usuario['Tercero']['empresa_id'],
                'CodigoDocumentoDetalle.centro_dist_id'=>$usuario['Tercero']['centro_dist_id'],
            )
        ));
        return $data['CodigoDocumentoDetalle']['ultimo_uso'];
    }
	
	//obtiene la series series asignadas al usuario correspondiente
	function getSerieUser($tipo_doc=null,$usuario=null){
		$data = $this->query("
			SELECT
			td_det.serie
			FROM
			seguridad.series_usuarios AS s
			Inner Join maestros.codigo_documento_detalles AS td_det ON s.serie_id = td_det.id
			Inner Join maestros.codigo_documentos AS tipo_doc ON td_det.codigo_documento_id = tipo_doc.id
			WHERE
			tipo_doc.id =  '$tipo_doc' AND
			s.usuario_id = '$usuario'	");

		$data=Set::extract($data, '{n}.0.serie');

        return $data[0];		
	}
	
    # Encontrar si el numero ya existe
    # @ string $tipo $numero $serial
    # @  $serial = el numero de documento siguiente de la tabla CodigoDocumentoDetalle
    function existDocumento($tipo,$numero, $serial){
        if($tipo == 125){
            // es quia de remision
            $this->bindModel(array('hasMany'=>array('Convenio'=>array('className'=>'Convenio'))));
            $documento = $this->Convenio->find('first',array(
                'recursive'=>-1,
                'fields'=>array('Convenio.numero_documento'),
                'order'=>array('Convenio.numero_documento'),
                'conditions'=>array(
                    'Convenio.activo'=>true,
//                    'Convenio.anulado'=>false,
                    'Convenio.numero_documento'=>$numero
                )
            ));
            // Busco el ultimo numero en caso de que estar correcta la serie
            $lastDocumento = $this->Convenio->find('first',array(
                'recursive'=>-1,
                'fields'=>array('Convenio.numero_documento'),
                'order'=>array('Convenio.numero_documento'=>'DESC'),
                'conditions'=>array(
                        'Convenio.activo'=>true,
//                        'Convenio.anulado'=>false,
                        'substring(Convenio.numero_documento,1,3)'=>"".substr($serial,0,3).""
                )
            ));
            $ultimoNumero   = $lastDocumento['Convenio']['numero_documento'];
            $number         = $documento['Convenio']['numero_documento'];
        } else if ($tipo==109){
            // es quia de remision
            $this->bindModel(array('hasMany'=>array('GuiaRemisione'=>array('className'=>'GuiaRemisione'))));
            $documento = $this->GuiaRemisione->find('first',array(
                'recursive'=>-1,
                'fields'=>array('GuiaRemisione.numero_documento'),
                'order'=>array('GuiaRemisione.numero_documento'),
                'conditions'=>array(
                    'GuiaRemisione.impreso'=>true,
                    'GuiaRemisione.activo'=>true,
//                    'GuiaRemisione.anulado'=>false,
                    'GuiaRemisione.numero_documento'=>$numero
                )
            ));
            // Busco el ultimo numero en caso de que estar correcta la serie
            $lastDocumento = $this->GuiaRemisione->find('first',array(
                'recursive'=>-1,
                'fields'=>array('GuiaRemisione.numero_documento'),
                'order'=>array('GuiaRemisione.numero_documento'=>'DESC'),
                'conditions'=>array(
                    'GuiaRemisione.impreso'=>true,
                    'GuiaRemisione.activo'=>true,
//                    'GuiaRemisione.anulado'=>false,
                    'substring(GuiaRemisione.numero_documento,1,3)'=>"".substr($serial,0,3).""
                )
            ));
            $ultimoNumero = $lastDocumento['GuiaRemisione']['numero_documento'];
            $number	= $documento['GuiaRemisione']['numero_documento'];
        } else {			
            $this->bindModel(array('hasMany'=>array('DocumentoVenta'=>array('className'=>'DocumentoVenta'))));
            $documento = $this->DocumentoVenta->find('first',array(
                'recursive'=>-1,
                'fields'=>array('DocumentoVenta.numero_documento'),
                'order'=>array('DocumentoVenta.numero_documento'),
                'conditions'=>array(
                    'DocumentoVenta.impreso'=>true,
                    'DocumentoVenta.activo'=>true,
//                    'DocumentoVenta.anulado'=>false,
                    'DocumentoVenta.codigo_documento_id'=>$tipo,
                    'DocumentoVenta.numero_documento'=>$numero
                )
            ));
            // Busco el ultimo numero en caso de que estar correcta la serie
            $lastDocumento = $this->DocumentoVenta->find('first',array(
                'recursive'=>-1,
                'fields'=>array('DocumentoVenta.numero_documento'),
                'order'=>array('DocumentoVenta.numero_documento'=>'DESC'),
                'conditions'=>array(
                    'DocumentoVenta.impreso'=>true,
                    'DocumentoVenta.activo'=>true,
//                    'DocumentoVenta.anulado'=>false,
                    'DocumentoVenta.codigo_documento_id'=>$tipo,
                    'substring(DocumentoVenta.numero_documento,1,3)'=>substr($serial,0,3)
                )
            ));
            $ultimoNumero = $lastDocumento['DocumentoVenta']['numero_documento'];
            $number	= $documento['DocumentoVenta']['numero_documento'];
        }
        // solo si hay documento anteriores
        if(!empty($lastDocumento)){
            # contamos cuantos caracteres tiene el serial
            $contar = strlen($serial);
            # sumamos el nuevo correlativo
            $nuevoNumero = $ultimoNumero+1;
            # en caso de que tenga 0 a la izuiqerda lo rellenamos para poder hacer el sig numero
            if(strlen($nuevoNumero)<$contar){
                    $nuevoNumero = str_pad($nuevoNumero,$contar, "0", STR_PAD_LEFT);
            }
            $actual = $numero;
            # en caso de que aun se encuentre el numero seguimos incrementando :D
            if(!empty($number)){
                $actual = $this->existDocumento($tipo,($nuevoNumero), $serial);
            }
            if(empty($number)){
                if($numero > $nuevoNumero){
                    $continuo = $nuevoNumero;
                } else {
                    $continuo = $numero;
                }
                $correlativo = $continuo;
            } else {
                if($ultimoNumero<$serial){
                    $continuo = $nuevoNumero;
                } else {
                    $continuo = $nuevoNumero;
                }
                $correlativo = $continuo;
            }
        } else {
                $correlativo = $numero;
        }
        return $correlativo;
    }
    /**
     * Valida numero de serie
     * @param int $codigo
     * @param String $numDoc
     * @param Array $usuario
     * @return array
     */
    function validSerial($codigo = null, $numDoc = null, $usuario = null){
        if (empty($usuario)) $usuario = $_SESSION['Usuario'];
		
        $numDoc = "".trim($numDoc)."";
        $documento = str_replace(' ', '', "".$numDoc."");
        $long = strlen($numDoc);        
        if(($long < 3)){
            $result = array('result'=>'','Mensaje'=>'Escriba minimo  3 Digitos','transferencia'=>false);
            return $result;
        }else{
            $serieNumDoc = substr("".$documento."", 0, 3);
            $series = $this->CodigoDocumentoDetalle->find('first',array(
                'fields' => array(
                    'CodigoDocumentoDetalle.id',
                    'CodigoDocumentoDetalle.serie',
                    'CodigoDocumentoDetalle.numero_inicial',
                    'CodigoDocumentoDetalle.numero_final',
                    'CodigoDocumentoDetalle.ultimo_uso',
                    'CodigoDocumentoDetalle.transferencia_gratuita'
                ),
                'conditions'=>array(
                    'CodigoDocumentoDetalle.codigo_documento_id'=>$codigo,
                    'CodigoDocumentoDetalle.serie'=>$serieNumDoc,
                    'CodigoDocumentoDetalle.empresa_id'=>$usuario['Tercero']['empresa_id'],
                    'CodigoDocumentoDetalle.centro_dist_id'=>$usuario['Tercero']['centro_dist_id'],
                    'CodigoDocumentoDetalle.activo'=>true
                ),
                'recursive'=>-1
            ));
            $id  	= $series['CodigoDocumentoDetalle']['id'];
            $serie  = $series['CodigoDocumentoDetalle']['serie'];
            $numIni = $series['CodigoDocumentoDetalle']['numero_inicial'];
            $numFin = $series['CodigoDocumentoDetalle']['numero_final'];
            $numUlt = $series['CodigoDocumentoDetalle']['ultimo_uso'];
            $numPas = $series['CodigoDocumentoDetalle']['numero_final']+1;
            $transf = $series['CodigoDocumentoDetalle']['transferencia_gratuita'];
            $numSig = $numUlt + 1;

            if($serie!=''){ // VERIFICO SI LA SERIE EXISTE                
                if(($numSig > $numIni) && ($numSig <= $numFin) && ($numSig < $numPas)){//VERIFICO SI NO SOBREPASA numUlt
                    if (!empty($usuario)){
                        $this->CodigoDocumentoDetalle->SeriesUsuario->recursive = -1;
                        $cantidad = $this->CodigoDocumentoDetalle->SeriesUsuario->find('count', array(
                           'conditions' =>array(
                               'serie_id'=>$id,
                               'usuario_id'=>$usuario['id']
                           )
                        ));
                        if ($cantidad <= 0){
                            $result=array('result'=>'', 'Mensaje'=>'No tiene privilegios para usar esta serie','transferencia'=>false);
                            return $result;
                        }
                    }
                    #cadena
                    $contar = strlen("".$numUlt."");
                    if(strlen("".$numSig."")<$contar){
                        $numSig = str_pad($numSig,$contar, "0", STR_PAD_LEFT);
                    }
                    # Verificar que existe en algun documento para poder asingar el numero
                    if(strlen($numDoc)<8){
                        $numero = "".$numSig."";
                    } else {
                        $numero = "".$numDoc."";
                    }
                   # contamos las el numero
                   $verificar = $this->existDocumento($codigo,$numero,$numSig);
                    # En caso de de que $VERIFICA devuelva un numero menor al numero siguiente ->
                    # --> cambiamos por el ultimo numero de la serie correcta. EN CASO contrario
                    # si es que es mayo devolvemos $verificar para seguir con el correlativo
                    if($verificar < $numSig){
                        $verificar = $numSig;
                    }
                    $result = array('result'=>$verificar, 'Mensaje'=>'','transferencia'=>$transf);
                    return $result;
                } else {
                    $result = array('result'=>'', 'Mensaje'=>'Numero fuera de rango','transferencia'=>false);//si la serie no existe y no esta habilitada
                    return $result;
                }
            } else {
                $result=array('result'=>'', 'Mensaje'=>'Serie Incorrecta','transferencia'=>false);//si la serie no existe y no esta habilitada
                return $result;
            }
        }
    }
    function updateLastUse($codigo = null, $serie = null, $numero = null, $usuario = null){
        if (empty($usuario)) $usuario = $_SESSION['Usuario'];

        $data = $this->CodigoDocumentoDetalle->find('first', array(
            'conditions'=>array(
                'CodigoDocumentoDetalle.codigo_documento_id'=>$codigo,
                'CodigoDocumentoDetalle.serie'=>$serie,
                'CodigoDocumentoDetalle.empresa_id'=>$usuario['Tercero']['empresa_id'],
                'CodigoDocumentoDetalle.centro_dist_id'=>$usuario['Tercero']['centro_dist_id'],
            ),
            'recursive'=>-1
        ));
        if(empty($data)){
            return false;
        } else {
            $lastNum = $data['CodigoDocumentoDetalle']['numero_final'] ;
            if($lastNum == $numero){
                $activo ='0';
            } else {
                $activo ='1';
            }
            $data['CodigoDocumentoDetalle']['ultimo_uso'] = $numero;
            $data['CodigoDocumentoDetalle']['activo'] = $activo;
            $res = $this->CodigoDocumentoDetalle->query(sprintf('
                UPDATE codigo_documento_detalles
                SET ultimo_uso=\'%s\', activo=true
                WHERE codigo_documento_id=\'%s\' AND serie=\'%s\' AND empresa_id=\'%s\' AND centro_dist_id=\'%s\' ',
                    $numero,$codigo,$serie,$usuario['Tercero']['empresa_id'],$usuario['Tercero']['centro_dist_id']));
//            die;
            return true;
//         return $this->CodigoDocumentoDetalle->save($data);
	}
    }	

    /**
     * Valida numero de serie
     * @param int $codigo
     * @param String $numDoc
     * @param Array $usuario
     * @return array
     */
    function validNumber($codigo = null, $numDoc = null, $usuario = null){
        if (empty($usuario)) $usuario = $_SESSION['Usuario'];
        $numDoc = trim($numDoc);
        $long = strlen($numDoc);
        $documento = str_replace(' ', '', $numDoc);
        if(($long != 9)){
            $result = array('result'=>'','Mensaje'=>'Escriba 9 Digitos');
            return $result;
        }else{
            $serieNumDoc = substr($documento, 0, 3);
            $series = $this->CodigoDocumentoDetalle->find('first',array(
                'fields' => array(
                    'CodigoDocumentoDetalle.id',
                    'CodigoDocumentoDetalle.serie',
                    'CodigoDocumentoDetalle.numero_inicial',
                    'CodigoDocumentoDetalle.numero_final',
                    'CodigoDocumentoDetalle.ultimo_uso'),
                'conditions'=>array(
                    'CodigoDocumentoDetalle.codigo_documento_id'=>$codigo,
                    'CodigoDocumentoDetalle.serie'=>$serieNumDoc,
                    'CodigoDocumentoDetalle.empresa_id'=>$usuario['Tercero']['empresa_id'],
                    'CodigoDocumentoDetalle.centro_dist_id'=>$usuario['Tercero']['centro_dist_id'],
                    'CodigoDocumentoDetalle.activo'=>true
                ),
                'recursive'=>-1
            ));

            $id  = $series['CodigoDocumentoDetalle']['id'];
            $serie  = $series['CodigoDocumentoDetalle']['serie'];
            $numIni = $series['CodigoDocumentoDetalle']['numero_inicial'];
            $numFin = $series['CodigoDocumentoDetalle']['numero_final'];
            $numUlt = $series['CodigoDocumentoDetalle']['ultimo_uso'];
            $numPas = $series['CodigoDocumentoDetalle']['numero_final']+1;
            $numSig = $numUlt + 1;

            if($serie!=''){ // VERIFICO SI LA SERIE EXISTE
                if($numDoc > $numIni && $numDoc <= $numFin){//VERIFICO SI NO SOBREPASA numUlt
                    if (!empty($usuario)){
                        $cantidad = $this->CodigoDocumentoDetalle->SeriesUsuario->find('count', array(
                           'conditions' =>array(
                               'serie_id'=>$id,
                               'usuario_id'=>$usuario['id']
                           ), 'recursive'=>-1
                        ));
                        if ($cantidad <= 0){
                            $result=array('result'=>'', 'Mensaje'=>'No tiene privilegios para usar esta serie');
                            return $result;
                        }
                    }
                    $result=array('result'=>$numSig, 'Mensaje'=>'');
                    return $result;
                } else {
                    $result=array('result'=>'', 'Mensaje'=>'Numero fuera de rango');//si la serie no existe y no esta habilitada
                    return $result;
                }
            } else {
                $result=array('result'=>'', 'Mensaje'=>'Serie Incorrecta');//si la serie no existe y no esta habilitada
                return $result;
            }
        }
    }
   
	
	
}
?>